package com.novax.ex.activity.open.api;

import com.novax.ex.activity.open.model.response.task.*;
import com.novax.ex.common.results.ReturnResult;
import com.novax.ex.common.util.PageQuery;
import com.novax.ex.common.util.PageUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * Description: 前台-新手引导
 *
 * @author shaw
 * @date 2023/6/19 15:03
 */
@Tag(name = "前台-新手引导模块", description = "前台-新手引导模块")
@FeignClient(url = "${remote.activity-service.endpoint}", name = "TaskApi", contextId = "TaskApi")
@RequestMapping
public interface TaskApi {

    /**
     * 新手任务 在项目上线以后注册的用户可以享受新手任务的福利 用户可以在这里做新手任务 并且可以查看进度
     *
     * @param token    用token来区分用户是否登录 如果没有登录 那么将展示默认的新手任务 如果登录了 需要展示用户做新手任务的进度
     * @param language 语言
     * @return 新手任务列表（包含用户做任务的进度）
     */
    @Operation(summary = "新手任务阶段")
    @GetMapping(value = "/v3/public/tasks/stage")
    ReturnResult<TaskModuleResponse> newbie(@RequestHeader(value = "token", required = false) String token,
                                            @RequestHeader("language") String language);

    /**
     * 活动规则 通过后管配置以后，可以在前台按照语言展示不同的文案信息
     *
     * @param language 语言
     * @return 文案信息
     */
    @Operation(summary = "活动规则")
    @GetMapping(value = "/v3/public/tasks/rules")
    ReturnResult<?> taskRule(@RequestHeader("language") String language);


    /**
     * 展示用户在对应的版本中要做的任务有哪些
     *
     * @param uid      用户ID
     * @param language 语言
     * @return 任务列表
     */
    @Operation(summary = "7天签到任务")
    @GetMapping(value = "/v3/tasks/sign")
    ReturnResult<List<TaskSignResponse>> signs(@RequestHeader("userId") Long uid,
                                               @RequestHeader("language") String language);

    /**
     * 展示用户再登录以后能看到自己签到7次能得到的奖励信息 而不是已经获得奖励的信息
     *
     * @param uid      用户ID
     * @param language 语言
     * @return 签到奖励列表
     */
    @Operation(summary = "7天签到奖励")
    @GetMapping(value = "/v3/tasks/sign/rewards")
    ReturnResult<List<TaskRewardResponse>> signRewards(@RequestHeader("userId") Long uid,
                                                       @RequestHeader("language") String language);

    /**
     * 用户7次签到任务的进展情况
     *
     * @param uid      用户ID
     * @param language 语言
     * @return 签到任务的进展情况
     */
    @Operation(summary = "7天签到任务完成状态")
    @GetMapping(value = "/v3/tasks/sign/state")
    ReturnResult<TaskDataResponse> signTaskState(@RequestHeader("userId") Long uid,
                                                 @RequestHeader("language") String language);

    /**
     * 用户所领取的奖励展示
     *
     * @param uid      用户ID
     * @param language 语言
     * @return 用户领取奖励总览
     */
    @Operation(summary = "用户领取奖励总览")
    @GetMapping(value = "/v3/tasks/rewards/overview")
    ReturnResult<PageUtil<TaskOverviewResponse>> rewardOverview(@RequestHeader("userId") Long uid,
                                                                @RequestHeader("language") String language,
                                                                @ParameterObject PageQuery query);

    /**
     * 用户领取奖励的明细信息
     *
     * @param uid      用户ID
     * @param language 语言
     * @param query    分页查询条件
     * @return 奖励明细
     */
    @Operation(summary = "用户领取奖励明细")
    @GetMapping(value = "/v3/tasks/rewards")
    ReturnResult<PageUtil<TaskRewardLogResponse>> rewardLogs(@RequestHeader("userId") Long uid,
                                                             @RequestHeader("language") String language,
                                                             @ParameterObject PageQuery query);

    @Operation(summary = "完成任务/领取奖励")
    @PostMapping(value = "/v3/tasks/rewards/receive")
    ReturnResult<Boolean> receive(@RequestHeader("userId") Long uid,
                                  @RequestHeader("language") String language,
                                  @RequestParam(value = "account", required = false) String account);


    @Operation(summary = "完成任务/领取奖励v2")
    @PostMapping(value = "/v3/tasks/rewards/receive/v2")
    @ApiResponse(description = "状态为200：data=1：领取奖励成功，data=0：领取奖励失败；" +
            "状态为500：data=1：twitter未关注,data=2：twitter已被占用")
    ReturnResult<Integer> receiveV2(@RequestHeader("userId") Long uid,
                                    @RequestHeader("language") String language,
                                    @RequestParam(value = "account", required = false) String account);

}
